#pragma once
#include <argparse/argparse.hpp>
#include <memory>
#include <string>

#include "common_export.h"

namespace
{
    class ArgumentParser;
}

class COMMON_EXPORT Args
{
public:
    //====================== 单例模式
    static Args& getInstance();

    // 禁止拷贝构造和拷贝赋值
    Args(const Args&) = delete;
    Args& operator=(const Args&) = delete;

    //======================初始化命令行解析器
    int Parse(int argc, char** argv);
    // 打印帮助信息
    void PrintHelp() const;

    //========================== test of dose statistics
    struct Te_DoseStat
    {
        std::string filePath;  // numpy .npz file path -> voxel volumes and doses
        std::string volumeName;
        std::string doseName;
    };

    bool IsRunTe_DoseStat() const;
    inline const Te_DoseStat& GetTe_DoseStat() const { return _te_dose_stat; }

private:
    // 私有构造函数
    Args();

    // 解析结果
    std::string _programName;

    Te_DoseStat _te_dose_stat;

    std::unique_ptr<argparse::ArgumentParser> _argsParser;
};

COMMON_EXPORT inline Args* args() { return &Args::getInstance(); }